From: Kamala Narasimhan Date: Tue, 15 Feb 2011 20:00:33 +0000 (+0000) Subject: libxl: disk specification: special case vhd X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~10767 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=583d10aea0701501b593710272e97d644089296e;p=xen.git libxl: disk specification: special case vhd Special case how we validate vhd image files. Without this patch when tap:aio:vhd prefixed image files are specified in the config file, disk validation and thus vm creation will fail. Signed-off-by: Kamala Narasimhan Acked-by: Ian Jackson Committed-by: Ian Jackson --- diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 9fe713976b..990aa8aa24 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -863,19 +863,30 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass) /******************************************************************************/ -static int validate_virtual_disk(libxl_ctx *ctx, char *file_name, - libxl_disk_backend backend_type, libxl_disk_format format) +static int validate_virtual_disk(libxl_ctx *ctx, char *file_name, + libxl_device_disk *disk) { struct stat stat_buf; + char *delimiter; - if ((file_name[0] == '\0') && (format == DISK_FORMAT_EMPTY)) + if (disk->format == DISK_FORMAT_EMPTY) return 0; + if (disk->format == DISK_FORMAT_RAW) { + delimiter = strchr(file_name, ':'); + if (delimiter) { + if (!strncmp(file_name, "vhd:", sizeof("vhd:")-1)) { + disk->format = DISK_FORMAT_VHD; + file_name = ++delimiter; + } + } + } + if ( stat(file_name, &stat_buf) != 0 ) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to stat %s", file_name); return ERROR_INVAL; } - if (backend_type == DISK_BACKEND_PHY) { + if (disk->backend == DISK_BACKEND_PHY) { if ( !(S_ISBLK(stat_buf.st_mode)) ) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual disk %s is not a block device!\n", file_name); @@ -899,8 +910,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis libxl__device device; int major, minor, rc; - rc = validate_virtual_disk(ctx, disk->pdev_path, disk->backend, - disk->format); + rc = validate_virtual_disk(ctx, disk->pdev_path, disk); if (rc) return rc;